package com.sgb.alimaplibrary.entity;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

import com.amap.api.maps.AMap;
import com.amap.api.maps.CameraUpdateFactory;
import com.amap.api.maps.model.BitmapDescriptor;
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.LatLngBounds;
import com.amap.api.maps.model.Marker;
import com.amap.api.maps.model.MarkerOptions;
import com.amap.api.services.core.PoiItem;
import com.sgb.alimaplibrary.R;

import java.util.ArrayList;
import java.util.List;

/**
 * Poi图层类。在高德地图API里，如果要显示Poi，可以用此类来创建Poi图层。如不满足需求，也可以自己创建自定义的Poi图层。
 *
 * @since V2.1.0
 */
public class PoiOverlay {
    private Context mContext;
    private List<PoiItem> mPois;
    private AMap mAMap;
    public ArrayList<Marker> mPoiMarks = new ArrayList<Marker>();
    public BitmapDescriptor bitmapDescriptor;

    /**
     * 通过此构造函数创建Poi图层。
     *
     * @param amap 地图对象。
     * @param pois 要在地图上添加的poi。列表中的poi对象详见搜索服务模块的基础核心包（com.amap.api.services.core）中的类<strong> <a href="../../../../../../Search/com/amap/api/services/core/PoiItem.html" title="com.amap.api.services.core中的类">PoiItem</a></strong>。
     * @since V2.1.0
     */
    public PoiOverlay(Context context, AMap amap, List<PoiItem> pois) {
        mAMap = amap;
        mPois = pois;
        mContext = context;
    }

    /**
     * 添加Marker到地图中。
     *
     * @since V2.1.0
     */
    public void addToMap(int icon, boolean isShowText) {
        try {
            if (icon != 0)
                bitmapDescriptor = BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(mContext.getResources(), icon));
            for (int i = 0; i < mPois.size(); i++) {
                Marker marker;
                if (bitmapDescriptor != null){
                    marker = mAMap.addMarker(getMarkerOptions(false, i, icon, isShowText,bitmapDescriptor));
                }else {
                    marker = mAMap.addMarker(getMarkerOptions(false, i, icon, isShowText));
                }
                marker.setObject(i);
                marker.setTitle(i + "");
                mPoiMarks.add(marker);
            }
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    /**
     * 去掉PoiOverlay上所有的Marker。
     *
     * @since V2.1.0
     */
    public void removeFromMap() {
        for (Marker mark : mPoiMarks) {
            mark.remove();
        }
    }

    /**
     * 移动镜头到当前的视角。
     *
     * @since V2.1.0
     */
    public void zoomToSpan() {
        try {
            if (mPois != null && mPois.size() > 0) {
                if (mAMap == null)
                    return;
                if (mPois.size() == 1) {
                    mAMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(mPois.get(0).getLatLonPoint().getLatitude(),
                            mPois.get(0).getLatLonPoint().getLongitude()), 18f));
                } else {
                    LatLngBounds bounds = getLatLngBounds();
                    mAMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 5));
                }
            }
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    private LatLngBounds getLatLngBounds() {
        LatLngBounds.Builder b = LatLngBounds.builder();
        for (int i = 0; i < mPois.size(); i++) {
            b.include(new LatLng(mPois.get(i).getLatLonPoint().getLatitude(),
                    mPois.get(i).getLatLonPoint().getLongitude()));
        }
        return b.build();
    }

    private MarkerOptions getMarkerOptions(boolean isBigMarkView, int index, int icon, boolean isShowText) {
        return new MarkerOptions()
                .position(
                        new LatLng(mPois.get(index).getLatLonPoint()
                                .getLatitude(), mPois.get(index)
                                .getLatLonPoint().getLongitude()))
                .title(getTitle(index)).snippet(getSnippet(index))
                .icon(getBitmapDescriptor(isBigMarkView, index, icon, isShowText));
    }

    private MarkerOptions getMarkerOptions(boolean isBigMarkView, int index, int icon, boolean isShowText, BitmapDescriptor bitmapDescriptor) {
        return new MarkerOptions()
                .position(
                        new LatLng(mPois.get(index).getLatLonPoint()
                                .getLatitude(), mPois.get(index)
                                .getLatLonPoint().getLongitude()))
                .title(getTitle(index)).snippet(getSnippet(index))
                .icon(bitmapDescriptor);
    }

    /**
     * 给第几个Marker设置图标，并返回更换图标的图片。如不用默认图片，需要重写此方法。
     *
     * @param index 第几个Marker。
     * @return 更换的Marker图片。
     * @since V2.1.0
     */
    public BitmapDescriptor getBitmapDescriptor(boolean isBigMarkView, int index, int icon, boolean isShowText) {
        View markerView = LayoutInflater.from(mContext).inflate(R.layout.view_marker, null,false);
        ImageView imageView = markerView.findViewById(R.id.marker);
        TextView textView = markerView.findViewById(R.id.text);
        if (isShowText) {
            textView.setText(index + 1 + "");
        } else {
            textView.setText("");
        }

        if (icon == 0) {
            icon = R.drawable.marker;
        }
        Drawable drawable = mContext.getResources().getDrawable(isBigMarkView ? R.drawable.marker_big : icon);
        if (isBigMarkView) {
            drawable.setBounds(0, 0, 45, 45);
        } else {
            drawable.setBounds(0, 0, 30, 30);
        }
        imageView.setImageDrawable(drawable);

        int smallFontSize = (int) mContext.getResources().getDimension(R.dimen.sp5);
        int bigFontSize = (int) mContext.getResources().getDimension(R.dimen.sp8);
        textView.setTextSize(isBigMarkView ? bigFontSize : smallFontSize);
        Bitmap bitmap = convertViewToBitmap(markerView);
        return BitmapDescriptorFactory.fromBitmap(bitmap);
    }

    //view 转bitmap
    public Bitmap convertViewToBitmap(View view) {
        view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
        view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
        view.buildDrawingCache();
        Bitmap bitmap = view.getDrawingCache();
        return bitmap;
    }

    /**
     * 返回第index的Marker的标题。
     *
     * @param index 第几个Marker。
     * @return marker的标题。
     * @since V2.1.0
     */
    protected String getTitle(int index) {
        return mPois.get(index).getTitle();
    }

    /**
     * 返回第index的Marker的详情。
     *
     * @param index 第几个Marker。
     * @return marker的详情。
     * @since V2.1.0
     */
    protected String getSnippet(int index) {
        return mPois.get(index).getSnippet();
    }

    /**
     * 从marker中得到poi在list的位置。
     *
     * @param marker 一个标记的对象。
     * @return 返回该marker对应的poi在list的位置。
     * @since V2.1.0
     */
    public int getPoiIndex(Marker marker) {
        for (int i = 0; i < mPoiMarks.size(); i++) {
            String title = mPoiMarks.get(i).getTitle();
            if (title.equals(marker.getTitle())) {
                return i;
            }
        }
        return -1;
    }

    /**
     * 返回第index的poi的信息。
     *
     * @param index 第几个poi。
     * @return poi的信息。poi对象详见搜索服务模块的基础核心包（com.amap.api.services.core）中的类 <strong><a href="../../../../../../Search/com/amap/api/services/core/PoiItem.html" title="com.amap.api.services.core中的类">PoiItem</a></strong>。
     * @since V2.1.0
     */
    public PoiItem getPoiItem(int index) {
        if (index < 0 || index >= mPois.size()) {
            return null;
        }
        return mPois.get(index);
    }
}
